#include "CobrarCheque.h"
#include "ui_CobrarCheque.h"

// CobrarCheque
extern QSqlDatabase enjoylifedb;
extern ChequeSqlTableModel  *cheques_model;
extern QTableView *cheques_view;
// Cuenta Corriente
QSqlRelationalTableModel *cc_model;
QTableView *cc_view;
// Cobro Mensual
QSqlRelationalTableModel *cm_model;
QTableView *cm_view;
// MovimientosModule
extern QSqlRelationalTableModel  *movimientos_model;
extern QTableView *movimientos_view;
extern QLineEdit *saldo_line1;

/*
 * Constructor de la clase ModificacionCheque.
 */
CobrarCheque::CobrarCheque(QWidget *parent) :
    QWidget(parent),
    cheq_model(new QSqlRelationalTableModel(this)),
    ui(new Ui::CobrarCheques)
{
    ui->setupUi(this);

    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);

    cheq_model->setTable("cheque");
    cc_model = new QSqlRelationalTableModel();
    cm_model = new QSqlRelationalTableModel();

    CargarPersonas();
    CargarConceptos();

    ui->comboBox_Persona->setFocus();

    connect(ui->cobradoBtn,SIGNAL(clicked()),this,SLOT(CobradoBtn()));
    connect(ui->noCobradoBtn,SIGNAL(clicked()),this,SLOT(NoCobradoBtn()));
    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(CerrarBtn()));

    // Definición de acceso directo para cobrar cheque.".
    QShortcut* shortcutCobrar = new QShortcut(QKeySequence("Ctrl+C"), this);
    connect(shortcutCobrar, SIGNAL(activated()), this, SLOT(CobradoBtn()));
    // Definición de acceso directo para no cobrar cheque.".
    QShortcut* shortcutNoCobrar = new QShortcut(QKeySequence("Ctrl+N"), this);
    connect(shortcutNoCobrar, SIGNAL(activated()), this, SLOT(NoCobradoBtn()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

/*
 * Destructor de la clase ModificacionMovimiento.
 */
CobrarCheque::~CobrarCheque()
{
    delete ui;
}

/**
 * @brief CargarPersonas
 * Carga personas en el combobox
 */
void CobrarCheque::CargarPersonas()
{
    // Carga las personas de la pabla persona
    QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
    QString stm2= "select persona from persona";

    if (! query2->exec(stm2)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query2->lastError().text());
        return;
    }
    ui->comboBox_Persona->addItem("");
    while (query2->next()) {
        ui->comboBox_Persona->addItem(query2->value(query2->record().indexOf("persona")).toString());
    }
}

/**
 * @brief AltaCheque::CargarConceptos
 * Carga conceptos en el combobox
 */
void CobrarCheque::CargarConceptos()
{
    // Carga las personas de la pabla cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto";

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros de conceptos, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->comboBox_concepto->addItem("");
    while (query->next()) {
        ui->comboBox_concepto->addItem(query->value(query->record().indexOf("concepto")).toString());
    }
}

/*
 * Obtiene la información del cheque elegido desde el modulo
 */
void CobrarCheque::GetChequesInfo(int i)
{
    row = i;
    ui->nroCheque->setText(cheques_model->index(i, 1).data().toString());
    ui->banco->setText(cheques_model->index(i, 2).data().toString());
    ui->fecha_recibido->setDate(cheques_model->index(i, 3).data().toDate());
    ui->fecha_cobro->setDate(cheques_model->index(i, 4).data().toDate());
    ui->comboBox_Persona->setCurrentText(cheques_model->index(i, 5).data().toString());
    ui->comboBox_concepto->setCurrentText(cheques_model->index(i, 6).data().toString());
    ui->monto->setText(cheques_model->index(i, 7).data().toString());
    ui->id_cheque->setText(cheques_model->index(i, 0).data().toString());
    if (cheques_model->index(i, 8).data().toString().isNull()) {
        ui->cobradoBtn->setEnabled(true);
        ui->noCobradoBtn->setEnabled(false);
    }
    else {
        if (cheques_model->index(i, 8).data().toString() == "NO") {
            ui->cobradoBtn->setEnabled(true);
            ui->noCobradoBtn->setEnabled(false);
        }
        else {
            ui->cobradoBtn->setEnabled(false);
            ui->noCobradoBtn->setEnabled(true);
        }
    }
}

/**
 * @brief CobrarCheque::CobradoBtn
 * Marca el cheque como cobrado.
 */
void CobrarCheque::CobradoBtn()
{
    QString idCheque = cheques_model->index(row, 0).data().toString();
    int cantRows = 0;
    QDate date;

    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Cheque"),
                                   "¿Está seguro que quiere guardar los cambios?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        QString filter = "id_cheque = '" + idCheque + "'";
        cheques_model->setFilter(filter);
        enjoylifedb.transaction();
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.commit();
        if (cheques_model->rowCount() == 1) {
            // Record para cheque
            QSqlRecord record = cheques_model->record(0);
            record.setValue("cobrado", "SI");

            // Se modifica el cheque
            cheques_model->setRecord(0, record);
            enjoylifedb.transaction();
            if (!cheq_model->submitAll()) {
                QString error = cheq_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            // Selecciona Cta Cte.
            QString filtroCC = "tipo_moneda = 'Cheque'";
            filtroCC.append(" and id_moneda = '").append(idCheque).append("'");
            cc_model->setTable("cuenta_corriente");
            cc_model->setFilter(filtroCC);
            enjoylifedb.transaction();
            if (!cc_model->select()) {
                QMessageBox::critical(this,"Error!", "No se pudo recuperar datos necesarios, intentelo de nuevo.");
                enjoylifedb.rollback();
                return;
            }
            cantRows = cc_model->rowCount();

            if (cantRows == 0) {
                // Se agrega un nuevo movimiento
                QString values = "values (";
                // Se agrega fecha de mov.
                values = values + "'" + ui->fecha_cobro->text() + "',";
                // Se agrega la persona
                values = values + "'" + ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()) + "',";
                // Se agrega el concepto
                values = values + "'" + ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()) + "',";
                // Se agrega el tipo de moneda
                values = values + "'Cheque',";
                // Se agrega el id de moneda
                values = values + "'" + ui->id_cheque->text() + "',";
                // Se agrega el debe
                QVariant val = ui->monto->text().toFloat();
                const int precision = 2;
                values = values + "'" + QString("%1").arg(val.toDouble(), 0, 'f', precision) + "',";
                // Se agrega el haber
                values = values + "'0.00')";
                // Se agrega la id de ctacte

                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "insert into movimiento (fecha_mov,m_persona,m_concepto,tipo_moneda,idmoneda,debe,haber) " + values;
                qDebug() << "Query raro: " << stm;
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo cargar la Cta. Cte. como un movimiento."
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
                enjoylifedb.commit();
                // Mensaje de advertencia.
                QMessageBox::information(this,"AVISO!", "El cheque fue registrado como ingreso de dinero. Por favor corroborar los datos.");
            }
            else {
                for (int i = 0; i < cantRows; ++i) {
                    QString idCC = cc_model->index(row,0).data().toString();
                    QVariant val2 = cc_model->index(row,4).data().toFloat();
                    QString tipoCobro = cc_model->index(row,2).data().toString();
                    QDate desde = cc_model->index(row,5).data().toDate();
                    const int precision2 = 2;
                    double monto = val2.toDouble();
                    double recargo = 0;

                    // Se modifica Cta. Cte.
                    QSqlRecord record = cc_model->record(i);
                    record.setValue("estado_deuda","Pagó");
                    record.setValue("fecha_pago",ui->fecha_cobro->date());
                    // Se agrega el debe
                    if (tipoCobro == "Esporádico") {
//                        if (desde.month() < ui->fecha_cobro->date().month()) {
//                            recargo = monto * 0.1;
//                        } else {
//                            if (desde.month() == ui->fecha_cobro->date().month()) {
//                                if (ui->fecha_cobro->date().day() >= 11 && ui->fecha_cobro->date().day() <= 20) {
//                                    recargo = monto * 0.05;
//                                }
//                                if (ui->fecha_cobro->date().day() >= 21) {
//                                    recargo = monto * 0.1;
//                                }
//                            }
//                        }
                    } else {
//                        if (desde.month() < ui->fecha_cobro->date().month()) {
//                            recargo = monto * 0.2;
//                        } else {
//                            if (desde.month() == ui->fecha_cobro->date().month()) {
//                                if (ui->fecha_cobro->date().day() >= 11 && ui->fecha_cobro->date().day() <= 20) {
//                                    recargo = monto * 0.1;
//                                }
//                                if (ui->fecha_cobro->date().day() >= 21) {
//                                    recargo = monto * 0.2;
//                                }
//                            }
//                        }
                    }// Se almacena el monto con recargo en cc
                    record.setValue("monto_pagado",QString("%1").arg(val2.toDouble() + recargo, 0, 'f', precision2));

                    cc_model->setRecord(i, record);
                    enjoylifedb.transaction();
                    if (!cc_model->submitAll()) {
                        QString error = cc_model->lastError().text();
                        QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                                "\n %1").arg(error));
                        enjoylifedb.rollback();
                        return;
                    }

                    // Selecciona Cobro mensual
                    QString cm_filter = "id_cobro_mensual = '" +idCC + "'";
                    cm_model->setTable("cobro_mensual");
                    cm_model->setFilter(cm_filter);
                    enjoylifedb.transaction();
                    if (!cm_model->select()) {
                        QMessageBox::critical(this,"Error!", "No se pudo recuperar datos necesarios, intentelo de nuevo.");
                        enjoylifedb.rollback();
                        return;
                    }
                    // Se modifica Cobro mensual
                    if (cm_model->rowCount() > 0) {
                        QSqlRecord recordCM = cm_model->record(i);
                        recordCM.setValue("estado_deuda","Pagó");
                        cm_model->setRecord(i, recordCM);
                        enjoylifedb.transaction();
                        if (!cm_model->submitAll()) {
                            QString error = cm_model->lastError().text();
                            QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de Cobro Mensual. Por favor controle los datos."
                                                                    "\n %1").arg(error));
                            enjoylifedb.rollback();
                            return;
                        }
                    }

                    // Se agrega un nuevo moviemiento
                    QString values = "values (";
                    // Se agrega fecha de mov.
                    values = values + "'" + ui->fecha_cobro->text() + "',";
                    // Se agrega la persona
                    values = values + "'" + ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()) + "',";
                    // Se agrega el concepto
                    values = values + "'" + ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()) + "',";
                    // Se agrega el tipo de moneda
                    values = values + "'Cheque',";
                    // Se agrega el id de moneda
                    values = values + "'" + ui->id_cheque->text() + "',";
                    // Se agrega el debe
                    QVariant val = cc_model->index(i,4).data().toFloat();
                    const int precision = 2;
                    values = values + "'" + QString("%1").arg(val.toDouble(), 0, 'f', precision) + "',";
                    // Se agrega el haber
                    values = values + "'0.00', ";
                    // Se agrega la id de ctacte
                    values = values + "'" + idCC + "')";

                    QSqlQuery *query = new QSqlQuery(enjoylifedb);
                    QString stm = "insert into movimiento (fecha_mov,m_persona,m_concepto,tipo_moneda,idmoneda,debe,haber,idctacte) " + values;
                    if (! query->exec(stm)) {
                        QMessageBox::critical(this,"Error!", "No se pudo cargar la Cta. Cte. como un movimiento."
                                              "intentelo nuevamente || " + query->lastError().text());
                        enjoylifedb.rollback();
                        return;
                    }
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                    // -----------------
                }
                // Mensaje de advertencia.
                QMessageBox::information(this,"AVISO!", "Las Cuentas Corrientes asociadas a este Cheque fueron "
                                         "marcadas como Pagas y se autogeneró los ingreso de dinero correspondientes "
                                         "en el módulo Movimientos. Por favor corroborar los datos.");
            }
        }
        else {
            QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos del movimiento, intentelo de nuevo."));
            enjoylifedb.rollback();
        }
    }
    else
        return;
    UpdateChequesList();
    CorrectViewOfModel();
    close();
}

/**
 * @brief CobrarCheque::NoCobradoBtn
 * Marca el cheque como no cobrado.
 */
void CobrarCheque::NoCobradoBtn()
{
    QString id_cheque = cheques_model->index(row, 0).data().toString();
    int cantRows = 0;

    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Cheque"),
                                   "¿Está seguro que quiere guardar los cambios?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        QString filter = "id_cheque = '" + id_cheque + "'";
        cheques_model->setFilter(filter);
        enjoylifedb.transaction();
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.commit();
        if (cheques_model->rowCount() == 1) {
            // Record para cheque
            QSqlRecord record = cheques_model->record(0);
            record.setValue("cobrado", "NO");

            // Se modifica el cheque
            cheques_model->setRecord(0, record);
            enjoylifedb.transaction();
            if (!cheq_model->submitAll()) {
                QString error = cheq_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }

            // Selecciona Cta Cte.
            QString filtroCC = "tipo_moneda = 'Cheque'";
            filtroCC.append(" and id_moneda = '").append(ui->id_cheque->text()).append("'");
            cc_model->setTable("cuenta_corriente");
            cc_model->setFilter(filtroCC);
            enjoylifedb.transaction();
            if (!cc_model->select()) {
                QMessageBox::critical(this,"Error!", "No se pudo recuperar datos necesarios, intentelo de nuevo.");
                enjoylifedb.rollback();
                return;
            }
            cantRows = cc_model->rowCount();

            if (cantRows == 0) {
                // Cheque no asoc a cc. 1-Se elimina el cheque de movimientos
                enjoylifedb.transaction();
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "delete from movimiento where idmoneda = '" + ui->id_cheque->text() + "'";
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo remover el cheque de los movimientos, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }
                QMessageBox::information(this,"AVISO!", "El cheque fue eliminado de movimientos.");
                enjoylifedb.commit();
                enjoylifedb.commit();
            }else {
                // Cheque asoc a cc. 1-Se modifica cc. 2-Se modifica Cobro mensual. 3-Se elimina el cheque de movimientos
                enjoylifedb.commit();
                int cantRows = cc_model->rowCount();
                for (int i = 0; i < cantRows; ++i) {
                    QString idCC = cc_model->index(row,0).data().toString();
                    // 1-Se modifica cc.
                    QSqlRecord record = cc_model->record(i);
                    record.setValue("estado_deuda","No informado");
                    cc_model->setRecord(i, record);
                    enjoylifedb.transaction();
                    if (!cc_model->submitAll()) {
                        QString error = cc_model->lastError().text();
                        QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                                "\n %1").arg(error));
                        enjoylifedb.rollback();
                        return;
                    }
                    // se modifica la fecha de cobro de cc.
                    QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
                    QString stm2 = "update cuenta_corriente set fecha_pago = NULL where id_cuenta_cor = '";
                    stm2.append(idCC).append("'");
                    enjoylifedb.transaction();
                    if (! query2->exec(stm2)) {
                        QMessageBox::critical(this,"Error!", "No se pudo actualizar la fecha de pago, "
                                              "intentelo nuevamente || " + query2->lastError().text());
                        enjoylifedb.rollback();
                        return;
                    }
                    // se modifica el monto pagado de cc
                    QSqlQuery *query3 = new QSqlQuery(enjoylifedb);
                    QString stm3 = "update cuenta_corriente set monto_pagado = NULL where id_cuenta_cor = '";
                    stm3.append(idCC).append("'");
                    enjoylifedb.transaction();
                    if (! query3->exec(stm3)) {
                        QMessageBox::critical(this,"Error!", "No se pudo actualizar el monto pagado, "
                                              "intentelo nuevamente || " + query3->lastError().text());
                        enjoylifedb.rollback();
                        return;
                    }


                    // 2-Se modifica Cobro mensual.
                    // Selecciona Cobro mensual
                    QString cm_filter = "id_cobro_mensual = '" +idCC + "'";
                    cm_model->setTable("cobro_mensual");
                    cm_model->setFilter(cm_filter);
                    enjoylifedb.transaction();
                    if (!cm_model->select()) {
                        QMessageBox::critical(this,"Error!", "No se pudo recuperar datos necesarios, intentelo de nuevo.");
                        enjoylifedb.rollback();
                        return;
                    }
                    // Se modifica Cobro mensual
                    if (cm_model->rowCount() > 0) {
                        QSqlRecord recordCM = cm_model->record(i);
                        recordCM.setValue("estado_deuda","Debe");
                        cm_model->setRecord(i, recordCM);
                        enjoylifedb.transaction();
                        if (!cm_model->submitAll()) {
                            QString error = cm_model->lastError().text();
                            QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de Cobro Mensual. Por favor controle los datos."
                                                                    "\n %1").arg(error));
                            enjoylifedb.rollback();
                            return;
                        }
                    }
                    // 3-Se elimina el cheque de movimientos
                    enjoylifedb.transaction();
                    QSqlQuery *query = new QSqlQuery(enjoylifedb);
                    QString stm = "delete from movimiento where idmoneda = '" + ui->id_cheque->text() + "'";
                    if (! query->exec(stm)) {
                        QMessageBox::critical(this,"Error!", "No se pudo remover el cheque de los movimientos, "
                                              "intentelo nuevamente || " + query->lastError().text());
                        enjoylifedb.rollback();
                        return;
                    }
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                    enjoylifedb.commit();
                }
                ControlVencimientos();
                QMessageBox::information(this,"AVISO!", "El cheque fue eliminado de movimientos. Y las Ctas. Ctes. "
                                         "asociads fueron actualizadas.");
            }
        }
        else {
            QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos del cheque, intentelo de nuevo."));
            enjoylifedb.rollback();
        }
    }
    else
        return;
    UpdateChequesList();
    CorrectViewOfModel();
    close();
}

/*
 * Cancela la modificación del movimiento.
 */
void CobrarCheque::CerrarBtn()
{
    enjoylifedb.transaction();
    if (!(cheques_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    hide();
    close();
}

void CobrarCheque::ControlVencimientos()
{
    int cantRows = 0;
    QDate date1;
    QDate date2;
    QString formatoMes = "MM";
    QString mes = date2.currentDate().toString(formatoMes);
    QString formatoAnio = "yyyy";
    QString anio = date2.currentDate().toString(formatoAnio);
    QString filtro;
    if (date1.currentDate().day() > 10) {
        filtro = "date_part('month', desde) <= '";
        filtro.append(mes).append("'");
        filtro.append(" and date_part('year', desde) <= '");
        filtro.append(anio).append("'");
        filtro.append(" and estado_deuda = 'No informado'");
    } else {
        filtro = "date_part('month', desde) < '";
        filtro.append(mes).append("'");
        filtro.append(" and date_part('year', desde) <= '");
        filtro.append(anio).append("'");
        filtro.append(" and estado_deuda = 'No informado'");
    }

    cc_model->setTable("cuenta_corriente");
    cc_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!cc_model->select()) {
        QMessageBox::critical(this,"Advertencia","No se pudo actualizar los estados de las Ctas. Ctes.");
        enjoylifedb.rollback();
        return;
    }
    cantRows = cc_model->rowCount();
    if (cantRows > 0) {
        for (int i = 0; i < cantRows; ++i) {
            QSqlRecord record = cc_model->record(i);
            record.setValue("estado_deuda","Debe");
            cc_model->setRecord(i, record);
            enjoylifedb.transaction();
            if (!cc_model->submitAll()) {
                QString error = cc_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            enjoylifedb.commit();
        }
    }
}

/*
 * Acción del boton: Actualiza la lista de cheques.
 */
void CobrarCheque::UpdateChequesList()
{
    enjoylifedb.transaction();
    cheques_model->setTable("cheque");
    if (!(cheques_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModel();
}

/*
 * Acomoda la vista del modulo Movimientos.
 */
void CobrarCheque::CorrectViewOfModel()
{
    cheques_model->setHeaderData(0,Qt::Horizontal,"Nro. Cheque");
    cheques_model->setHeaderData(1,Qt::Horizontal,"Fecha Recibido");
    cheques_model->setHeaderData(2,Qt::Horizontal,"Fecha Cobro");
    cheques_model->setHeaderData(3,Qt::Horizontal,"Persona");
    cheques_model->setHeaderData(4,Qt::Horizontal,"Concepto");
    cheques_model->setHeaderData(5,Qt::Horizontal,"Monto");

    cheques_view->setModel(cheques_model);
    cheques_view->setCornerButtonEnabled(true);
    cheques_view->setAlternatingRowColors(true);
    cheques_view->setGridStyle(Qt::SolidLine);
    cheques_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cheques_view->setWordWrap(true);
    cheques_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    cheques_view->sortByColumn(1,Qt::SortOrder());
    cheques_view->hideColumn(6);
}

// Funciones para actualizar correctamente la vista y el saldo en movimientos

/*
 * Acción del boton: Actualiza la lista de moviemientos.
 */
void CobrarCheque::UpdateMovimientosList()
{
    QDate date;
    date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio, mes;
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);

    QString filtroMov;
    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";
    movimientos_model->setTable("movimiento");
    movimientos_model->filter().clear();
    movimientos_model->setFilter(filtroMov);
    if (!(movimientos_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModelMov();
    CalcularSaldoMensual();
}

/*
 * Acomoda la vista del modulo Movimientos.
 */
void CobrarCheque::CorrectViewOfModelMov()
{
    movimientos_model->setHeaderData(1,Qt::Horizontal,"Fecha");
    movimientos_model->setHeaderData(2,Qt::Horizontal,"Persona");
    movimientos_model->setHeaderData(3,Qt::Horizontal,"Concepto");
    movimientos_model->setHeaderData(4,Qt::Horizontal,"Tipo Moneda");
    movimientos_model->setHeaderData(5,Qt::Horizontal,"Debe");
    movimientos_model->setHeaderData(6,Qt::Horizontal,"Haber");

    movimientos_view->setModel(movimientos_model);
    movimientos_view->setCornerButtonEnabled(true);
    movimientos_view->setAlternatingRowColors(true);
    movimientos_view->setGridStyle(Qt::SolidLine);
    movimientos_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    movimientos_view->setWordWrap(true);
    movimientos_view->horizontalHeader()->setStretchLastSection(true);
    movimientos_view->sortByColumn(1,Qt::SortOrder());
    movimientos_view->hideColumn(0);
    movimientos_view->hideColumn(7);

    movimientos_view->setColumnWidth(1,90);
    movimientos_view->setColumnWidth(2,300);
    movimientos_view->setColumnWidth(3,300);
    movimientos_view->setColumnWidth(4,120);
    movimientos_view->setColumnWidth(5,100);
    movimientos_view->setColumnWidth(6,100);
}

/*
 *
 */
void CobrarCheque::CalcularSaldoMensual()
{
    QDate date;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio, mes;
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);
    QString filtroMov;
    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";

    enjoylifedb.transaction();
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select sum(debe) as sumDebe, sum(haber) as sumHaber from movimiento where " + filtroMov;
    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudo recuperar los datos necesarios para calcular el saldo actual, "
                              "intentelo nuevamente || " + query->lastError().text());
        enjoylifedb.rollback();
        return;
    }

    double sumDebe, sumHaber;
    while (query->next()) {
        if (query->last()) {
            sumDebe = query->value(query->record().indexOf("sumDebe")).toDouble();
            sumHaber = query->value(query->record().indexOf("sumHaber")).toDouble();
        }
    }
    QVariant val = sumDebe - sumHaber;
    const int precision = 2;
    saldo_line1->setText(QString("%1").arg(val.toDouble(), 0, 'f', precision));

    enjoylifedb.commit();
}
